#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/errno.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
typedef struct temp
{
    char ch[32];
    int true;
}temp,*ftemp;


int main(int argc,const char*  argv[]){

    key_t key = ftok("./app",'a');
    if(key < 0){
        perror("ftok err");
        return -1;
    }
    printf("%#x\n",key);

    int shmid = shmget(key,sizeof(temp),IPC_CREAT | IPC_EXCL | 0666);
    if(shmid <= 0){
        if(errno == EEXIST){
            shmid = shmget(key,sizeof(temp),0666);
        }else{
            perror("shmget err");
            return -1;
        }
    }

    printf("shmid:%d\n",shmid);

    ftemp p=(void*)shmat(shmid,NULL,0);
    if(p == (ftemp)-1){
        perror("shmat err");
        return -1;
    }
    ftemp fone=(ftemp)p;
    memset(fone,0,sizeof(temp));

    pid_t pid = fork();
    if(pid < 0){
        perror("fork err");
        return -1;
    }else if(pid == 0){
        
        while(1){
            
            if((*fone).true == 1){//检测是否输入
                if(strcmp((*fone).ch,"quit") == 0){
                    break;
                }

                printf("子进程:%s\n",(*fone).ch);
                (*fone).true=0;//归零(输出执行完的信号)
            }
        }
        
        
    }else{
        while(1){
        
            scanf("%s",(*fone).ch);
            (*fone).true =1;//输入后便发送信号

            if(strcmp((*fone).ch,"quit") == 0){
                break;
            }
            
            while((*fone).true == 1)//等待true的值改变(等待线程发送信号)
            {
                sleep(1);
            }
        
        }

        wait(NULL);//回收子进程
        
    }




    shmdt(p);//取消映射

    shmctl(shmid,IPC_RMID,NULL);//删除共享内存
    return 0;
}